/**
 * 日期工具模块 - Vue2 格式
 * 提供各种日期计算和格式化功能
 */

const DateUtils = {
  /**
   * 获取指定类型的日期
   * @param {string} type - 日期类型
   * @param {Date|string} date - 基准日期，默认为今天
   * @returns {Date} 返回对应的日期对象
   */
  getDate(type = 'today', date = new Date()) {
    // 确保 date 是 Date 对象
    const baseDate = date instanceof Date ? new Date(date) : new Date(date);
    
    const result = new Date(baseDate);
    
    switch (type.toLowerCase()) {
      case 'today':
        return result;
        
      case 'yesterday':
        result.setDate(result.getDate() - 1);
        return result;
        
      case 'tomorrow':
        result.setDate(result.getDate() + 1);
        return result;
        
      case 'daybeforeyesterday': // 前天
      case 'beforeyesterday':
        result.setDate(result.getDate() - 2);
        return result;
        
      case 'dayaftertomorrow': // 后天
      case 'aftertomorrow':
        result.setDate(result.getDate() + 2);
        return result;
        
      case 'lastweek': // 上周
      case 'previousweek':
        result.setDate(result.getDate() - 7);
        return result;
        
      case 'nextweek': // 下周
        result.setDate(result.getDate() + 7);
        return result;
        
      case 'lastmonth': // 上个月
      case 'previousmonth':
        result.setMonth(result.getMonth() - 1);
        return result;
        
      case 'nextmonth': // 下个月
        result.setMonth(result.getMonth() + 1);
        return result;
        
      case 'lastyear': // 去年
      case 'previousyear':
        result.setFullYear(result.getFullYear() - 1);
        return result;
        
      case 'nextyear': // 明年
        result.setFullYear(result.getFullYear() + 1);
        return result;
        
      case 'fiveyearsago':
      case 'fiveyearsbefore':
        result.setFullYear(result.getFullYear() - 5);
        return result;
        
      case 'firstdayofmonth': // 本月第一天
        return new Date(result.getFullYear(), result.getMonth(), 1);
        
      case 'lastdayofmonth': // 本月最后一天
        return new Date(result.getFullYear(), result.getMonth() + 1, 0);
        
      case 'firstdayofyear': // 今年第一天
        return new Date(result.getFullYear(), 0, 1);
        
      case 'lastdayofyear': // 今年最后一天
        return new Date(result.getFullYear(), 11, 31);
        
      case 'startofweek': // 本周第一天（周日）
        const day = result.getDay();
        result.setDate(result.getDate() - day);
        return result;
        
      case 'endofweek': // 本周最后一天（周六）
        const day2 = result.getDay();
        result.setDate(result.getDate() + (6 - day2));
        return result;
        
      default:
        console.warn(`不支持的日期类型: ${type}，返回今天日期`);
        return result;
    }
  },

  /**
   * 格式化日期为字符串
   * @param {Date} date - 要格式化的日期
   * @param {string} format - 格式模板，默认 'YYYY-MM-DD'
   * @returns {string} 格式化后的日期字符串
   */
  formatDate(date, format = 'YYYY/MM/DD') {
    if (!(date instanceof Date) || isNaN(date.getTime())) {
      throw new Error('Invalid date provided to formatDate');
    }
    
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');
    
    return format
      .replace('YYYY', year)
      .replace('MM', month)
      .replace('DD', day)
      .replace('HH', hours)
      .replace('mm', minutes)
      .replace('ss', seconds);
  },

  /**
   * 获取日期的友好显示（如：刚刚、2分钟前、3天前等）
   * @param {Date|string} date - 日期
   * @returns {string} 友好时间字符串
   */
  getFriendlyTime(date) {
    const now = new Date();
    const target = date instanceof Date ? date : new Date(date);
    const diffInSeconds = Math.floor((now - target) / 1000);
    
    if (diffInSeconds < 60) {
      return '刚刚';
    } else if (diffInSeconds < 3600) {
      return `${Math.floor(diffInSeconds / 60)}分钟前`;
    } else if (diffInSeconds < 86400) {
      return `${Math.floor(diffInSeconds / 3600)}小时前`;
    } else if (diffInSeconds < 2592000) {
      return `${Math.floor(diffInSeconds / 86400)}天前`;
    } else {
      return this.formatDate(target, 'YYYY-MM-DD');
    }
  },

  /**
   * 获取两个日期之间的天数差
   * @param {Date} date1 - 第一个日期
   * @param {Date} date2 - 第二个日期
   * @returns {number} 天数差
   */
  getDaysDiff(date1, date2) {
    const time1 = date1.getTime();
    const time2 = date2.getTime();
    return Math.floor(Math.abs(time1 - time2) / (1000 * 60 * 60 * 24));
  },

  /**
   * 检查日期是否是今天
   * @param {Date} date - 要检查的日期
   * @returns {boolean} 是否是今天
   */
  isToday(date) {
    const today = new Date();
    return this.formatDate(date) === this.formatDate(today);
  },

  /**
   * 获取当前时间戳
   * @returns {number} 当前时间戳（毫秒）
   */
  getTimestamp() {
    return Date.now();
  },

  /**
   * 获取当前季度
   * @param {Date} date - 日期
   * @returns {number} 季度 (1-4)
   */
  getQuarter(date = new Date()) {
    const month = date.getMonth();
    return Math.floor(month / 3) + 1;
  },

  /**
   * 获取季度第一天
   * @param {Date} date - 日期
   * @returns {Date} 季度第一天
   */
  getFirstDayOfQuarter(date = new Date()) {
    const quarter = this.getQuarter(date);
    const month = (quarter - 1) * 3;
    return new Date(date.getFullYear(), month, 1);
  }
};

// 导出为 Vue 插件
DateUtils.install = function(Vue) {
  Vue.prototype.$date = DateUtils;
  Vue.date = DateUtils;
};

// 导出默认对象
export default DateUtils;